package io.github.echarts.model.theme.provider;

import io.github.echarts.model.context.ConfigurationContext;
import io.github.echarts.model.theme.AbstractDefaultValueProvider;
import io.github.echarts.model.theme.Theme;
import io.github.echarts.option.component.Title;
import io.github.echarts.option.style.TextStyle;

/**
 * 标题默认值提供者
 * <p>
 * 为标题组件提供默认配置，包括文本样式、位置等。
 * 根据上下文调整标题显示策略。
 * </p>
 */
public class TitleDefaultValueProvider extends AbstractDefaultValueProvider<Title> {
    
    /**
     * 构造函数
     */
    public TitleDefaultValueProvider() {
        super(Title.class);
    }
    
    @Override
    protected void initDefaultValues() {
        // 基本属性
        registerDefaultValue("show", true);
        registerDefaultValue("text", "");
        registerDefaultValue("left", "center");
        registerDefaultValue("top", 0);
        registerDefaultValue("itemGap", 10);
    }
    
    @Override
    public void applyDefaults(Title title, ConfigurationContext context) {
        super.applyDefaults(title, context);
        
        // 设置默认文本样式
        if (title.getTextStyle() == null) {
            TextStyle textStyle = new TextStyle();
            textStyle.setFontSize(18);
            textStyle.setFontWeight("bold");
            title.setTextStyle(textStyle);
        }
        
        // 设置默认副标题文本样式
        if (title.getSubtextStyle() == null && title.getSubtext() != null && !title.getSubtext().isEmpty()) {
            TextStyle subtextStyle = new TextStyle();
            subtextStyle.setFontSize(14);
            subtextStyle.setColor("#666666");
            title.setSubtextStyle(subtextStyle);
        }
    }
    
    @Override
    protected void applyDataDrivenDefaults(Title title, ConfigurationContext context) {
        // 根据上下文数据调整标题
        
        // 如果标题为空，尝试从上下文中获取默认标题
        if ((title.getText() == null || title.getText().isEmpty()) && context != null) {
            // 尝试从上下文中获取图表类型作为默认标题
            Object chartTypeObj = context.get("chartType");
            if (chartTypeObj != null) {
                String chartType = chartTypeObj.toString();
                String defaultTitle = generateTitleFromChartType(chartType);
                title.setText(defaultTitle);
            }
        }
        
        // 如果有数据描述信息，可以设置为副标题
        Object dataDescriptionObj = context.get("dataDescription");
        if (dataDescriptionObj != null && (title.getSubtext() == null || title.getSubtext().isEmpty())) {
            title.setSubtext(dataDescriptionObj.toString());
        }
    }
    
    /**
     * 根据图表类型生成默认标题
     * 
     * @param chartType 图表类型
     * @return 默认标题
     */
    private String generateTitleFromChartType(String chartType) {
        if (chartType == null) {
            return "图表";
        }
        
        switch (chartType.toLowerCase()) {
            case "bar":
                return "柱状图";
            case "line":
                return "折线图";
            case "pie":
                return "饼图";
            case "scatter":
                return "散点图";
            case "radar":
                return "雷达图";
            case "heatmap":
                return "热力图";
            case "tree":
                return "树图";
            case "treemap":
                return "矩形树图";
            case "sunburst":
                return "旭日图";
            case "boxplot":
                return "箱线图";
            case "candlestick":
                return "K线图";
            case "funnel":
                return "漏斗图";
            case "gauge":
                return "仪表盘";
            case "graph":
                return "关系图";
            case "sankey":
                return "桑基图";
            default:
                return "图表";
        }
    }
    
    @Override
    public void ensureCompleteness(Title title, ConfigurationContext context) {
        // 确保文本样式对象的完整性
        if (title.getTextStyle() == null) {
            title.setTextStyle(new TextStyle());
        }
        
        // 如果有副标题，确保副标题样式的完整性
        if (title.getSubtext() != null && !title.getSubtext().isEmpty() && title.getSubtextStyle() == null) {
            title.setSubtextStyle(new TextStyle());
        }
    }
    
    @Override
    public void applyTheme(Title title, Theme theme) {
        if (title == null || theme == null) {
            return;
        }
        
        // 应用主文本样式
        if (title.getTextStyle() != null) {
            TextStyle textStyle = title.getTextStyle();
            TextStyle themeTextStyle = theme.getTextStyle();
            
            if (themeTextStyle != null) {
                // 只应用未设置的属性
                if (textStyle.getColor() == null) {
                    textStyle.setColor(themeTextStyle.getColor());
                }
                if (textStyle.getFontFamily() == null) {
                    textStyle.setFontFamily(themeTextStyle.getFontFamily());
                }
            }
        } else {
            TextStyle textStyle = new TextStyle();
            TextStyle themeTextStyle = theme.getTextStyle();
            
            if (themeTextStyle != null) {
                textStyle.setColor(themeTextStyle.getColor());
                textStyle.setFontFamily(themeTextStyle.getFontFamily());
                textStyle.setFontSize(18);  // 标题字体稍大
                textStyle.setFontWeight("bold");
            }
            
            title.setTextStyle(textStyle);
        }
        
        // 应用副标题文本样式
        if (title.getSubtext() != null && !title.getSubtext().isEmpty()) {
            if (title.getSubtextStyle() != null) {
                TextStyle subtextStyle = title.getSubtextStyle();
                TextStyle themeTextStyle = theme.getTextStyle();
                
                if (themeTextStyle != null) {
                    // 只应用未设置的属性
                    if (subtextStyle.getColor() == null) {
                        // 副标题颜色通常比主标题浅一些
                        subtextStyle.setColor(lightenColor(themeTextStyle.getColor(), 0.3));
                    }
                    if (subtextStyle.getFontFamily() == null) {
                        subtextStyle.setFontFamily(themeTextStyle.getFontFamily());
                    }
                }
            } else {
                TextStyle subtextStyle = new TextStyle();
                TextStyle themeTextStyle = theme.getTextStyle();
                
                if (themeTextStyle != null) {
                    // 副标题颜色通常比主标题浅一些
                    subtextStyle.setColor(lightenColor(themeTextStyle.getColor(), 0.3));
                    subtextStyle.setFontFamily(themeTextStyle.getFontFamily());
                    subtextStyle.setFontSize(14);  // 副标题字体稍小
                }
                
                title.setSubtextStyle(subtextStyle);
            }
        }
    }
    
    /**
     * 使颜色变浅
     * 
     * @param color 原始颜色（十六进制格式，如"#333333"）
     * @param factor 变浅因子（0-1之间）
     * @return 变浅后的颜色
     */
    private String lightenColor(String color, double factor) {
        if (color == null || !color.startsWith("#") || color.length() != 7) {
            return "#666666";  // 默认灰色
        }
        
        try {
            // 解析RGB分量
            int r = Integer.parseInt(color.substring(1, 3), 16);
            int g = Integer.parseInt(color.substring(3, 5), 16);
            int b = Integer.parseInt(color.substring(5, 7), 16);
            
            // 变浅
            r = (int) Math.min(255, r + (255 - r) * factor);
            g = (int) Math.min(255, g + (255 - g) * factor);
            b = (int) Math.min(255, b + (255 - b) * factor);
            
            // 转回十六进制
            return String.format("#%02x%02x%02x", r, g, b);
        } catch (Exception e) {
            return "#666666";  // 默认灰色
        }
    }
} 